﻿using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace WxLib.Pay
{
    /// <summary>
    /// 微信支付异步通知结果
    /// </summary>
    [XmlRoot("xml", IsNullable = false)]
    public class NotifyResults
    {
        /// <summary>
        /// 返回状态码，SUCCESS/FAIL 此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
        /// </summary>
        public string return_code { get; set; }

        /// <summary>
        /// 返回信息，如非空，为错误原因签名失败、参数格式校验错误
        /// </summary>
        public string return_msg { get; set; }

        /// <summary>
        /// 小程序ID 
        /// </summary>
        public string appid { get; set; } //	wx8888888888888888	微信分配的小程序ID

        /// <summary>
        ///店面号 
        /// <summary>
        public string mch_id { get; set; } //	是	String(32)	1900000109	微信支付分配的店面号

        /// <summary>
        ///设备号 
        /// </summary>
        public string device_info { get; set; }	//否	String(32)	013467007045764	微信支付分配的终端设备号，

        /// <summary>
        ///随机字符串 
        /// </summary>
        public string nonce_str { get; set; }	//是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串，不长于32位

        /// <summary>
        ///签名 
        /// </summary>
        public string sign { get; set; }	//是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	签名，详见签名算法

        /// <summary>
        ///签名类型 
        /// </summary>
        public string sign_type { get; set; }	//否	String(32)	HMAC-SHA256	签名类型，目前支持HMAC-SHA256和MD5，默认为MD5

        /// <summary>
        ///业务结果 
        /// </summary>
        public string result_code { get; set; }	//是	String(16)	SUCCESS	SUCCESS/FAIL

        /// <summary>
        ///错误代码 
        /// </summary>
        public string err_code { get; set; }	//否	String(32)	SYSTEMERROR	错误返回的信息描述

        /// <summary>
        ///错误代码描述 
        /// </summary>
        public string err_code_des { get; set; }	//否	String(128)	//系统错误	错误返回的信息描述

        /// <summary>
        ///用户标识 
        /// </summary>
        public string openid { get; set; }	//是	String(128)	wxd930ea5d5a258f4f	用户在店面appid下的唯一标识

        /// <summary>
        ///是否关注公众账号 
        /// </summary>
        public string is_subscribe { get; set; }	//否	String(1)	//Y	用户是否关注公众账号，Y-关注，N-未关注，仅在公众账号类型支付有效

        /// <summary>
        ///交易类型 
        /// </summary>
        public string trade_type { get; set; }	//是	String(16)	JSAPI	JSAPI、NATIVE、APP

        /// <summary>
        ///付款银行 
        /// </summary>
        public string bank_type { get; set; }	//是	String(16)	CMC	银行类型，采用字符串类型的银行标识，银行类型见银行列表

        /// <summary>
        ///订单金额 
        /// </summary>
        public int total_fee { get; set; }	//是	Int	100	订单总金额，单位为分

        /// <summary>
        ///应结订单金额
        /// </summary>
        public int? settlement_total_fee { get; set; }	//否	Int	100	应结订单金额=订单金额-非充值代金券金额，应结订单金额<=订单金额。

        /// <summary>
        ///货币种类 
        /// </summary>
        public string fee_type { get; set; }	//否	String(8)	CNY	货币类型，符合ISO4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型

        /// <summary>
        ///现金支付金额 
        /// </summary>
        public int cash_fee { get; set; }	//是	Int	100	现金支付金额订单现金支付金额，详见支付金额

        /// <summary>
        ///现金支付货币类型 
        /// </summary>
        public string cash_fee_type { get; set; }	//否	String(16)	//CNY	货币类型，符合ISO4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型

        /// <summary>
        ///代金券金额 
        /// </summary>
        public int? coupon_fee { get; set; }	//否	Int	10	代金券金额<=订单金额，订单金额-代金券金额=现金支付金额，详见支付金额

        /// <summary>
        ///代金券使用数量 
        /// </summary>
        public int? coupon_count { get; set; }	//否	Int	1	代金券使用数量
        /// <summary>
        //代金券类型 
        /// </summary>
        // public int	coupon_type_$n 	{ get; set; } //	否	Int
        /*
    CASH--充值代金券 
    NO_CASH---非充值代金券
    仅在使用了免充值代金券时有返回（取值：CASH、NO_CASH）。$n为下标,从0开始编号，举例：coupon_type_0
         * )*/

        //代金券ID	
        //public string coupon_id_$n	//否	String(20)	//10000	代金券ID,$n为下标，从0开始编号
        //单个代金券支付金额
        //public int	coupon_fee_$n	//否	Int	//100	单个代金券支付金额,$n为下标，从0开始编号

        /// <summary>
        ///微信支付订单号
        /// </summary>
        public string transaction_id { get; set; }	//是	String(32)	//1217752501201407033233368018	微信支付订单号

        /// <summary>
        ///店面订单号
        /// </summary>
        public string out_trade_no { get; set; }	//是	String(32)	//1212321211201407033568112322	店面系统的订单号，与请求一致。

        /// <summary>
        ///商家数据包 
        /// </summary>
        public string attach { get; set; }	//否	String(128)	//123456	商家数据包，原样返回

        /// <summary>
        ///支付完成时间 
        /// </summary>
        public string time_end { get; set; }	//是	String(14)	//20141030133525	支付完成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则

        /// <summary>
        /// 是否成功
        /// </summary>
        /// <returns></returns>
        public bool IsSuccess()
        {
            return return_code == "SUCCESS" && result_code == "SUCCESS";
        }


    }
}
